home *** CD-ROM | disk | FTP | other *** search
/ The Programmer Disk / The Programmer Disk (Microforum).iso / xpro / basic1 / pro9 / fed-demo.bas < prev    next >
Encoding:
BASIC Source File  |  1987-07-31  |  19.5 KB  |  537 lines

  1. REM $TITLE:      'FED - DEMO'
  2. REM $SUBTITLE:  'Text input demo '
  3.  
  4. REM  (C) InfoSoft, 1987
  5.  
  6. CLEAR
  7. DEFINT a-z
  8. OPTION BASE 1
  9.  
  10. 'make sure it is set up right
  11.  
  12. CLS : SOUND 750,2 : LOCATE 5,5
  13. PRINT "Depending on your display, you may want to restart this demo"
  14. LOCATE 7,5
  15. PRINT "with the command line parameter [/CMD /NC] or [/CMD /C]. /NC for"
  16. LOCATE 9,5
  17. PRINT "No Color, /C for color version.   This should be noted in F-DEMO.BAT"
  18. LOCATE 13,5
  19. PRINT "Tap `S' to stop the demo, any other key to continue."
  20.  
  21. GOSUB wait.key
  22.  
  23. IF ky$="S" OR ky$="s" THEN
  24.    GOTO ext
  25. END IF
  26.  
  27. '*********** get command line parms and set colors
  28. DIM arg$(2) : q%=0
  29. FOR x = 1 TO 2
  30.  arg$(x)=SPACE$(LEN(COMMAND$)/2)
  31. NEXT x
  32. CALL cmdline(arg$(),q%)
  33.  
  34. IF arg$(1)="/NC" THEN                   ' find out if command line wants color
  35.    fg=7 : bg=0
  36.    fge=15 : bge=0
  37.    fgw=0 : bgw=7
  38.    fgd=15 : bgs=0
  39.    fgh=7 : bgh=15
  40.    fgb=15 : bgb=0
  41.    fgt=7 : bgt=0
  42. ELSE
  43.    fg=2:bg=0                     ' general colors
  44.    fge=12:bge=3                  ' err message colors
  45.    fgw=14:bgw=4                  ' window colors
  46.    fgd=10:bgs=0                  ' data colors
  47.    fgh=15 : bgh=1                ' help colors
  48.    fgb=4 : bgb=0                 ' box color
  49.    fgt=3 : bgt=0                 ' text colors
  50. END IF
  51.  
  52. eattr=(bge*16)+fge               ' error message attributes
  53. wattr=(bgw*16)+fgw               ' window attributes
  54. hattr=(bgh * 16 ) + fgh          ' help window attributes
  55.  
  56.  
  57. DIM sarry(4000)                     'dimension screen array for 2 screens
  58. sptr1%=VARPTR(sarry(1))              ' points to first screen position
  59. sptr2%=VARPTR(sarry(2001))           ' points to second screen position
  60.  
  61.  
  62.  
  63. DIM hlp$(10)      ' String array to hold help screen msgs for use later.
  64.           ' Has to be DIMmed in code prior to other references
  65.           ' to hlp$().
  66.  
  67.    hlp$(1)="Home - Start of line             End - End of line"
  68.    hlp$(2)="  "
  69.    hlp$(3)="Ctrl-X  Clear Field      Ctrl-End  Clear to end of line"
  70.    hlp$(4)="Ctrl-U  Undo             <Arrows> Fwd, Bkwd 1 field "
  71.    hlp$(5)="  "
  72.    hlp$(6)="       PgUp / Ctrl PgUp - Jump to first field "
  73.    hlp$(7)="       PgDn / Ctrl PgDn - Jump to last field  "
  74.    hlp$(8)="  "
  75.    hlp$(9)="[Esc] or [F9] Aborts Current Edit      [F10] Save Record"
  76.  
  77.    hlp$(10)="[ Tap any key to continue ]"
  78.  
  79.  
  80.  
  81. prg.start:              '*************** start of program  *****************
  82.  
  83.  
  84. GOSUB gen.disp                        ' put screen mask on screen
  85. CALL svscrn(sptr1%)                   ' save it - RSTSCRN is quicker next time
  86.  
  87. GOSUB openfil                         ' open the file
  88.  
  89. IF hi=0 THEN GOSUB newfil
  90. rec.no = hi                            ' get the top rec no
  91.  
  92. GOSUB rec.disp                        ' display given record
  93.  
  94. '*****************************************************************************
  95. '*  Each label below the sets up the flags and variables for editing for one *
  96. '*  of the fields in the database or on the screen.  A MAJOR part of the     *
  97. '*  Field EDitor (FED), is in the subroutine called CHGFLD, which routes the *
  98. '*  flow of the code to the appropriate points.  The random access file      *
  99. '*  contained here is pretty minimal - just enough to be able to demo FED.   *
  100. '*  In a "real" random file application, there are a number of things that   *
  101. '*  should be done in the way of checking for valid data, also, there are    *
  102. '*  functions missing like to delete a record (missing because it does not   *
  103. '*  lend itself to demoing FED or GIZLIB).  There ARE several other GIZLIB   *
  104. '*  functions used: ERRMSG, DLRFRMAT, NFRMAT, WDW and a few others.          *
  105. '*****************************************************************************
  106.  
  107.  
  108. ed.n:                        '-----  edit name  ------
  109.    LOCATE 4,10
  110.    ' FED parameters
  111.    ucase=1 : nums=0 : bleep=1            ' turn caps only ON, nums only OFF,
  112.    fsiz=25                               '   error sound ON, set size of string
  113.    CALL fed(mn$, fsiz%, fcode%)
  114.  
  115.          '--- handles part of the return from FED ----------
  116.    IF fcode = 5 THEN                             ' if up arrow, go up one
  117.       GOTO ed.n
  118.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  119.       GOSUB chgfld                               ' see where they want to go
  120.    END IF
  121.  
  122.     ' if down or enter pressed, just advance one field
  123.  
  124.  
  125.  
  126. ed.p:                        ' ----- edit phone number ---------
  127.    LOCATE 4,57
  128.    ucase=0 : nums=1 : num$="1234567890-" : bleep=0
  129.    fsiz=8 : temp$=mp$                    ' save a copy of phone in case of error
  130.    CALL fed(temp$, fsiz%, fcode%)
  131.    m=2 : p=0                              ' m sets NFRMAT mode, p is useless
  132.    CALL nfrmat(temp$, m, p)
  133.  
  134.    IF m=2 THEN                               ' if format went okay
  135.       mp$=temp$                              ' assign value to memory var
  136.    ELSE                                      ' something went wrong !!
  137.       CALL errmsg(temp$, 23, eattr%, 2)      ' tell them of error
  138.       GOTO ed.p                              ' note that we do not know what the
  139.    END IF                                    ' error is! Just that there is one
  140.  
  141.    IF fcode=5 THEN                               ' up arrow...
  142.       GOTO ed.n                                  ' ...back up one field
  143.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  144.       GOSUB chgfld                               ' see where they want to go
  145.    END IF
  146.  
  147.  
  148. ed.a:                             '-----  edit address  -----
  149.    LOCATE 6,13
  150.    nums=0 : ucase=0 : fsiz=25 : bleep=1   ' nums only OFF, caps OFF, bleepr ON
  151.    CALL fed(ma$, fsiz%, fcode%)
  152.  
  153.    IF fcode=5 THEN                               ' up arrow
  154.       GOTO ed.p
  155.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  156.       GOSUB chgfld                               ' see where they want to go
  157.    END IF
  158.  
  159.  
  160. ed.c:                            ' -----  edit city  -----
  161.    LOCATE 8,10
  162.    ucase=1 : nums=0 : fsiz=10 : bleep=1      ' caps ON, nums only OFF, sound ON
  163.    CALL fed(mc$, fsiz%, fcode%)
  164.  
  165.    IF fcode=5 THEN                               ' up arrow
  166.       GOTO ed.a
  167.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  168.       GOSUB chgfld                               ' see where they want to go
  169.    END IF
  170.  
  171.  
  172. ed.s:                            ' -----  edit state  -----
  173.    LOCATE 8,42
  174.    fsiz=2 : bleep=0                            ' turn sound ON, set size
  175.    CALL fed(ms$, fsiz%, fcode%)
  176.  
  177.    IF fcode=5 THEN                               ' up arrow
  178.       GOTO ed.c
  179.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  180.       GOSUB chgfld                               ' see where they want to go
  181.    END IF
  182.  
  183. ed.z:                            '-----  edit zip code  -----
  184.    LOCATE 8,60
  185.    nums=1 : num$="1234567890"            ' turn nums only ON, bleepr OFF
  186.    fsiz=5 : bleep=0
  187.    CALL fed(mz$, fsiz%, fcode%)
  188.  
  189.    IF fcode=5 THEN                               ' up arrow
  190.       GOTO ed.s
  191.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  192.       GOSUB chgfld                               ' see where they want to go
  193.    END IF
  194.  
  195.  
  196. ed.d:                            '-----  edit department  -----
  197.    LOCATE 12,16
  198.    ucase=1 : nums=0                   ' caps ON, nums only OFF, bleepr ON
  199.    fsiz=6 : bleep=1
  200.    CALL fed(md$, fsiz%, fcode%)
  201.  
  202.    IF fcode=5 THEN                               ' up arrow
  203.       GOTO ed.z
  204.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  205.       GOSUB chgfld                               ' see where they want to go
  206.    END IF
  207.  
  208.  
  209. ed.sv:                            '-----  edit supervisor name  -----
  210.    LOCATE 12,57
  211.    fsiz=12                            ' same bleepr, caps and nums state
  212.    CALL fed(msv$, fsiz%, fcode%)
  213.  
  214.    IF fcode=5 THEN                               ' up arrow
  215.       GOTO ed.d
  216.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  217.       GOSUB chgfld                               ' see where they want to go
  218.    END IF
  219.  
  220.  
  221. ed.pf:                           '-----  edit pay freq  -----
  222.    LOCATE 14,41
  223.    fsiz=1                              ' same caps etc settings
  224.    temp$=mfreq$                        ' save a copy cause they can screw it up
  225.    CALL fed(temp$, fsiz%, fcode%)
  226.    IF INSTR("HS",temp$)=0 THEN
  227.       CALL errmsg("Pay Frequency code must be H or S only.", 24, eattr%, 2)
  228.       GOTO ed.pf
  229.    END IF
  230.    mfreq$=temp$                         ' assign correct one
  231.  
  232.    IF fcode=5 THEN                               ' up arrow
  233.       GOTO ed.sv
  234.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  235.       GOSUB chgfld                               ' see where they want to go
  236.    END IF
  237.  
  238.  
  239. ed.r:                              '-----  edit pay rate  -----
  240.    LOCATE 14,70
  241.    nums=1 : num$="1234567890.$"          'turn nums only on, turn OFF bleepr
  242.    bleep=0 : fsiz=6 : temp$=mrat$
  243.    CALL fed(temp$, fsiz%, fcode%)
  244.  
  245.    m=0 : p=2                      ' set up for dollar formatting call
  246.    CALL dlrfrmat(temp$, m%, p%)
  247.  
  248.    IF m<>0 THEN                     ' if m is changed
  249.       CALL errmsg(temp$, 24, eattr, 2)        '
  250.       GOTO ed.r
  251.    END IF
  252.    mrat$=temp$
  253.  
  254.    IF fcode=5 THEN                               ' up arrow
  255.       GOTO ed.pf
  256.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  257.       GOSUB chgfld                               ' see where they want to go
  258.    END IF
  259.  
  260.  
  261. ed.pin:                            '-----  edit PIN code  -----
  262.    LOCATE 16,17 : PRINT mpin$           ' it is previuosly hidden
  263.    nums=1 : num$="1234567890"
  264.    bleep=0 : fsiz=4                      ' bleep is same as last one, but
  265.    LOCATE 16,17                          ' they can JUMP here via PgDn
  266.  
  267.    CALL fed(mpin$, fsiz%, fcode%)
  268.    LOCATE 16,17 : PRINT STRING$(4,254)           ' re hide their code
  269.  
  270.  
  271.    IF fcode=5 THEN                               ' up arrow
  272.       GOTO ed.r
  273.    ELSEIF fcode <> 6 OR fcode <> 0 THEN          ' if NOT down or enter
  274.       GOSUB chgfld                               ' see where they want to go
  275.    END IF
  276.  
  277.  
  278.  
  279. savrec:                         ' save a record
  280.    GOSUB closefil                    ' LSET and close the file
  281.    edt=0                             ' reset the edit flag
  282.    GOSUB show.rec                    ' show the new version
  283.    GOTO ed.n                         ' go to first field
  284.  
  285.  
  286. ext:
  287. SYSTEM
  288. '================================[ SUBROUTINES ]==============================
  289.  
  290. '******************************************************************************
  291. '*  In the way that FED is implemented here, most all of the FED Exit codes   *
  292. '* (aka FCODE), can be handled in a gosub to something like the following.    *
  293. '* Regardless of what field they are editting, F9, F10, F1, PgUp, PgDn etc    *
  294. '* all mean the same thing: abort, save, help, Jump to start, jump to end etc *
  295. '* The only FCODE that cannot be handled here (given the way that I have      *
  296. '* this implementation set up) is and Up Arrow (fcode=5).  ENTER, and Dn Arrow*
  297. '* (fcodes 0 and 6) are not handled here or at all actually, they "fall thru" *
  298. '* to the next label rather than being routed here.                           *
  299. '* Some sort of routine like this is essential to FED's operation.            *
  300. '******************************************************************************
  301.  
  302. chgfld:
  303.  
  304. IF edt THEN                        ' This part is not critical,
  305.    COLOR bgb, fgb                  '  but shows user when current
  306.    LOCATE 1, 35                    '  record is different from data
  307.    PRINT " [ EDITING ] "           '  in file.
  308. ELSE
  309.    COLOR fgb, bgb
  310.    LOCATE 1, 38
  311.    PRINT STRING$(15, 205);        ' overwrite EDITING flag
  312. END IF
  313. COLOR fg,bg
  314.  
  315.  
  316. SELECT CASE fcode            ' CASE is new to QB 3.0 - will not compile in 2.x
  317.  
  318.  CASE 1                                        ' F1 key pressed (HELP)
  319.     CALL svscrn(sptr2%)                            ' save screen as is
  320.     CALL wdw(7, 12, 17, 72, 1, 1, 2, hattr,"Editing Help")
  321.  
  322.     FOR x=1 TO 9                                   ' pop help window up
  323.     CALL quikprt(hlp$(x), 7+x, 14, hattr%)
  324.     NEXT x                                         ' QUIKPRT help msgs
  325.     LOCATE 18, 30 : COLOR fgh, bgh : PRINT hlp$(10)
  326.  
  327.     GOSUB wait.key                                 ' wait for any key
  328.     CALL rstscrn(sptr2%)                           ' restore pre help screen
  329.     RETURN                                         ' RETURN to next label
  330.  
  331.  
  332.  CASE 3                                        ' F3 page back a record
  333.     IF edt THEN                                  ' they have changed something
  334.        CALL errmsg("You cannot PAGE until current edit is saved.", 24, eattr%, 2)
  335.        RETURN
  336.     END IF
  337.  
  338.     IF rec.no > 1 THEN rec.no=rec.no-1           ' back up a record
  339.  
  340.     CALL rstscrn(sptr1%)                     ' restore blank screen (bleed thru)
  341.     GOSUB rec.disp                               ' display desired record
  342.     RETURN ed.n                                  ' goto first field
  343.  
  344.  
  345.  
  346.   CASE 4                                       ' F4 page forward a record
  347.     IF edt THEN                                  ' they have changed something
  348.        CALL errmsg("You cannot PAGE until current edit is saved.", 24, eattr%, 2)
  349.        RETURN
  350.     END IF
  351.  
  352.     IF rec.no < hi THEN rec.no=rec.no+1          ' forward a record
  353.  
  354.     CALL rstscrn(sptr1%)
  355.     GOSUB rec.disp                               ' display desired record
  356.     RETURN ed.n                                  ' goto first field
  357.  
  358.  
  359.   CASE 7                                       ' F7 add a record
  360.     IF edt then
  361.        CALL errmsg("Cannot ADD until current EDIT is saved.", 24, eattr, 2)
  362.     ELSE
  363.        rec.no=hi+1                               ' increment record pointer
  364.                 ' ----  set all mem vars to nul strings  -----
  365.        mn$="" : mp$="" : ma$="" : mc$="" : ms$=""
  366.        mz$="" : md$="" : msv$="" : mfreq$=""
  367.        mrat$="" : mpin$=STRING$(4,254)
  368.  
  369.        CALL rstscrn(sptr1%)
  370.        GOSUB show.rec                             ' display
  371.        RETURN ed.n
  372.     END IF
  373.  
  374.  
  375.   CASE 9, 15                              ' F9, ESC
  376.     rec.no=1                               ' this should have a "ARE YOU SURE"
  377.     GOSUB rec.disp                         ' prompt if it was more than demo
  378.     RETURN ed.n                            ' redisplay current record
  379.  
  380.  
  381.   CASE 10                                     ' F10 save record
  382.     RETURN savrec
  383.  
  384.   CASE 11, 13                                  'Pg Up or ^Pg Up
  385.     RETURN ed.n
  386.  
  387.   CASE 12, 14                                  'Pg Dn or ^Pg Dn
  388.     RETURN ed.pin
  389.  
  390.   CASE ELSE                              ' handles all other fed codes
  391.     RETURN                               ' (F2, F8 - advance a field)
  392.  
  393. END SELECT
  394.  
  395.  
  396.  
  397.  
  398. openfil:         '-----------   open demo file and FIELD statements  ---------
  399.    OPEN "emp.dat" AS #1 LEN=104
  400.    FIELD #1, 25 AS n$, 8 AS p$, 25 AS a$, 10 AS c$, 2 AS s$, 5 AS z$, _
  401.          6 AS d$, 12 AS sv$, 1 AS freq$, 6 AS rat$, 4 AS pin$
  402.  
  403. sof=LOF(1)/104                        ' sof is number of records in file
  404. hi=sof                                ' hi is high record number
  405. RETURN
  406.  
  407.  
  408. closefil:       '-------------  LSET and store the record ---------------
  409.    LSET n$=mn$ : LSET p$=mp$ : LSET a$=ma$ : LSET c$=mc$ : LSET s$=ms$
  410.    LSET z$=mz$ : LSET d$=md$ : LSET sv$=msv$ : LSET freq$=mfreq$
  411.    LSET rat$=mrat$ : LSET pin$=mpin$
  412.  
  413.    PUT #1, rec.no                      ' move record to buffer
  414.    CLOSE #1                            ' actually put file to disk
  415.    GOSUB openfil                       ' open file again in updated state
  416. RETURN
  417.  
  418.  
  419. rec.disp:            '---------- put selected record to the screen  -----------
  420.  
  421.                 ' convert to memory variable to edit a COPY
  422.                 ' of each and strip trailing blanks
  423.    GET #1, rec.no
  424.  
  425.    mn$=n$ : CALL stripr(mn$)     :     mp$=p$ : CALL stripr(mp$)
  426.    ma$=a$ : CALL stripr(ma$)     :     mc$=c$ : CALL stripr(mc$)
  427.    ms$=s$ : CALL stripr(ms$)     :     mz$=z$ : CALL stripr(mz$)
  428.    md$=d$ : CALL stripr(md$)     :     msv$=sv$ : CALL stripr(msv$)
  429.    mfreq$=freq$ : CALL stripr(mfreq$)    :     mrat$=rat$ : CALL stripr(mrat$)
  430.    mpin$=pin$ : CALL stripr(mpin$)
  431.  
  432.  
  433. show.rec:                  ' display the record
  434.  
  435. IF edt THEN                        ' This part is not critical,
  436.    COLOR bgb, fgb                  '  but shows user when current
  437.    LOCATE 1, 35                    '  record is different from data
  438.    PRINT " [ EDITING ] "           '  in file.
  439. ELSE
  440.    COLOR fgb, bgb
  441.    LOCATE 1, 35
  442.    PRINT STRING$(15, 205);
  443. END IF
  444. COLOR fg,bg
  445.  
  446.  
  447.    COLOR fg,bg
  448.    LOCATE 4,10 : PRINT mn$
  449.    LOCATE 4,57 : PRINT mp$
  450.    LOCATE 6,13 : PRINT ma$
  451.    LOCATE 8,10 : PRINT mc$
  452.    LOCATE 8,42 : PRINT ms$
  453.    LOCATE 8,60 : PRINT mz$
  454.  
  455.    LOCATE 12,16 : PRINT md$
  456.    LOCATE 12,57 : PRINT msv$
  457.    LOCATE 14,41 : PRINT mfreq$
  458.    LOCATE 14,70 : PRINT mrat$
  459.    LOCATE 16,17 : PRINT STRING$(4,254)
  460.    LOCATE 16,71 : COLOR fgw,0 : PRINT rec.no%
  461.    COLOR fg,bg
  462.    edt=0          ' set edit flag to show that record on screen is same as file
  463.  
  464. RETURN
  465.  
  466.  
  467.  
  468. gen.disp:
  469. '*****************************************************************************
  470. '*  Routine to put general display on the screen, this is used once.  After  *
  471. '*  it is put to the screen, it is saved via SVSCRN, and restored from there *
  472. '*  rather than doing all these PRINTs again.                                *
  473. '*****************************************************************************
  474.  
  475.    CALL boxes(5,1,fgb)                     'put a big box on screen
  476.    COLOR fgt+8
  477.    LOCATE 2,25 : PRINT "XYZ Corporation Employee Data File"      ' a title
  478.    COLOR fgt
  479.    LOCATE 4,4 : PRINT "Name: "
  480.    LOCATE 4,50 : PRINT "Phone: "
  481.    LOCATE 6,4 : PRINT "Address: "
  482.    LOCATE 8,4 : PRINT "City: "
  483.    LOCATE 8,35 : PRINT "State: "
  484.    LOCATE 8,55 : PRINT "Zip: "
  485.    LOCATE 12,4 : PRINT "Department: "
  486.    LOCATE 12,45 : PRINT "Supervisor: "
  487.    LOCATE 14,4 : PRINT "Hourly / Salary Level (H or S only): "
  488.    LOCATE 14,60 : PRINT "Pay Rate: "
  489.    LOCATE 16, 55 : PRINT "Record Number: ";
  490.  
  491.  
  492.    LOCATE 16,4 : PRINT "4 Digit PIN: "
  493.    COLOR 4,0 : LOCATE 17,1 : PRINT CHR$(199)+STRING$(78,196)+CHR$(182)
  494.    COLOR fgt+8 : LOCATE 18,30 : PRINT "Editing Keys:": COLOR fgt
  495.    LOCATE 20,5 : PRINT "[F1] - Help     [F7] Add Record    [F9] - Abort Edit     [F10] - Save"
  496.    LOCATE 21,10 : PRINT "[F3] - Page back one record   [F4] - Page forward one record"
  497.    LOCATE 22,10 : PRINT "[Enter] - Advances a field.   [PgDn] - Jump to last field"
  498.    LOCATE 23,5 : PRINT "[PgUp] - Jump to first field   <Arrow Keys> Advance or back up one field."
  499.  
  500. RETURN
  501.  
  502.  
  503. newfil:       '---------------- make a new file if demo one got lost  -------
  504.    mn$="JIM LOTUS"
  505.    mp$="555-0123"
  506.    ma$="1432 OAK STREET"
  507.    mc$="CENTERVILE"
  508.    ms$="MA"
  509.    mz$="01234"
  510.    md$="EXEC."
  511.    msv$="NONE"
  512.    mfreq$="S"
  513.    mrat$="900.00"
  514.    mpin$="1234"
  515.  
  516.    rec.no=1
  517.    GOSUB closefil
  518. RETURN
  519.  
  520. wait.key:             '--------loop until a key is pressed - handy to have
  521. ky$=""
  522. DO UNTIL ky$<>""
  523.   ky$=INKEY$
  524. LOOP
  525. RETURN
  526.  
  527. '*****************************************************************************
  528. '*  Here is how & where we include the external FED file into our code.      *
  529. '*  Earlier QB versions had problems with SHARED variables passed to INCLUDE *
  530. '*  files unless the included file was put towards the end of the code.  Out *
  531. '*  of habit (and fear) I still $INCLUDE them late in the code.              *
  532. '*****************************************************************************
  533.  
  534. REM $INCLUDE: 'FED.BAS'
  535.  
  536.  
  537.